一、问题起因:

新TF包在上传至苹果后台以后,相关的包出现了“二进制文件无效”的情况!

首先排查一下邮箱,发现收到邮件提示:

1
2
Please correct the following issues and upload a new binary to App Store Connect.
ITMS-91061: Missing privacy manifest - Your app includes “Frameworks/X.framework/X”, which includes X, an SDK that was identified in the documentation as a commonly used third-party SDK. If a new app includes a commonly used third-party SDK, or an app update adds a new commonly used third-party SDK, the SDK must include a privacy manifest file. Please contact the provider of the SDK that includes this file to get an updated SDK version with a privacy manifest. For more details about this policy, including a list of SDKs that are required to include signatures and manifests, visit: https://developer.apple.com/support/third-party-SDK-requirements.

我们先分析一下:

粗看一眼,我们发现这个问题就是缺少隐私清单造成的,但是因为我们App之前就已经适配过了缺少隐私清单的问题,所以就感到很奇怪,已经有了App隐私清单,为什么还要我们去适配呢?

后面仔细一看,发现我们之前只适配了主App的隐私清单,现在要求每个三方的SDK都需要单独的隐私清单。

因为我们的App不止一个,为什么有些App会出现这种情况,另外一些App没有出现这种情况呢?

我们着重下面这句话:

1
If a new app includes a commonly used third-party SDK, or an app update adds a new commonly used third-party SDK, the SDK must include a privacy manifest file.

也就是说如果你是一个新上线的App,里面包含了三方SDK的,每个用到的三方SDK都需要包含各自的隐私清单文件。或者说你的App已经在线上发布过了,如果下次新增了三方的SDK,那么该SDK则需要包含对应的隐私清单文件。

需要适配的三方SDK列表也在官方网站上列出来了:third-party-SDK-requirements

二、解决方案

问题原因已经找到了,那么我们该怎么去解决这个问题呢?首先肯定是Google、各种AI大模型一顿乱搜,找到了一个官方回复:ITMS-91061: Missing privacy manifest

看完之后发现,要适配三方SDK的隐私清单文件,目前有两种方案可行:

方案一:把用到的三方SDK全部升级到有隐私清单文件的版本(对我们这种中大型App,伴随着三方SDK的大版本升级改动很大,牵一发动全身,线上造成影响无法评估)

关于苹果官方需要适配隐私清单的三方SDK列表中的所有SDK最小支持隐私清单文件的SDK版本,网上已经有整理好的文档,详见:需适配的三方SDK最小支持隐私清单文件列表

方案二:把对应的隐私清单文件注入到三方SDK中(影响范围小,但是不知道方案是否可行)

对比完成后,我们选择第二种解决方案。开整!

在网上查找发现,其实目前已经有相关开源项目可以解决这个问题:

方法一:app privacy manifest fixer

方法二:cocoapods-privacy

以上两种方法大家可以自己根据项目结构来选择(项目地址详见文章末尾参考资料),我们项目没用那么复杂,所以选择了开箱即用的方法:app privacy manifest fixer

三、app privacy manifest fixer 使用指南(更多说明详见开源项目的README)

1、下载最新版本,解压后命名为app_privacy_manifest_fixer,放置项目根目录下。

2、在Xcode中,找到项目对应的 TARGETS Tab,选择对应的target

3、切换到对应Build Phases选项卡,点击右上角的“+”按钮,选择“New Run Script Phase”

4、创建一个”Run Script”并命名为”Fix Privacy Manifest”

5、在shell脚本框里,添加以下代码:

1
"$PROJECT_DIR/path/to/app_privacy_manifest_fixer/fixer.sh"

如果app_privacy_manifest_fixer文件夹不在project文件夹里,脚本中的$PROJECT_DIR变量建议使用绝对地址来代替。

1
2
$WORKSPACE_DIR:当前目录包含.xcworkspace的目录
$PROJECT_DIR:当前包含.xcodeproj文件的目录

注意:我们的项目使用的是workspace形式的,所以我们在shell脚本中使用了 $WORKSPACE_DIR 变量,后面发现这个变量在Xcode16以上才生效,如果是Xcode15的朋友此处请注意一下不要使用$WORKSPACE_DIR变量。

6、编译打包后验证结果:可以直接解开打包产物IPA包,在Frameworks文件夹中找到对应的三方SDK文件夹,其中就包含对应的隐私清单文件。

四、结语

到此为止,问题总算暂时解决了(先松一口气)!

上述只是一个临时解决方案,在此特别记录一下,希望能够帮到有需要的人。

大家还是尽可能把自己项目中的用到的三方SDK升级到对应包含隐私清单文件的版本,这个才是最终解决方案。

五、参考资料:

1、app privacy manifest fixer

2、cocoapods-privacy


更多好文推荐,欢迎关注 《iOS开发秘籍》 公众号,获取最新的内容

本文内容中部分来自网络,后续会持续更新完善。欢迎一起学习交流!

如需转载,请注明出处

ITMS-91061: Missing privacy manifest for third-party SDKs